/**
 * HTTP封装
 * @author weiximei
 */

import { config } from '../config.js'
import { api } from './api.js'

const tips = {
  1: '抱歉，出现了一个错误',
  1005: 'appkey无效',
  3000: '期刊不存在'
}

class HTTP {

  /**
   * 对外使用请求
   * @param {*} url 
   * @param {*} path 
   * @param {*} data 
   * @param {*} method 
   */
  request({ url, path={}, data={}, method="GET" }) {
    return new Promise((resolve, reject) => {
      this._request(url, resolve, reject, path, data, method)
    })
  }

  /**
   * 私有请求
   * @param {
       url: { type: String }
       method: { type: {} || Object }, 
       data: { type: {} || Object }, 

       // url的path参数值
       // 我们约定参数名要和 url 的 path 参数名称一致。
       // 比如：参数 index 对应 url 的path参数 :index
       path: { type: {} || Object },
       header: { type: {} || Object }, 
       success: { type: function }, 
       fail: { type: function },
   * } params 
   */
  _request(url, resolve, reject, path={}, data={}, method="GET") {


    const _url = this._url_params_path_conversion(url, path)

    wx.request({
      url: config.api_base_url + _url,
      method,
      data,
      header: {
        'content-type': 'application/json',
        'appkey': config.appkey
      },
      success: (res) => {
        const code = res.statusCode.toString()
        // 状态 2xx
        if (code.startsWith('2')) {
          // 传递响应数据
          resolve(res.data)
        } else {
          reject()
          const error_code = res.data.error_code
          this._show_error(error_code)
        }

      },
      fail: (err) => { // 错误处理, 只有断网情况，500情况才会进到这里
        reject()
        this._show_error(1)
      }
    })
  }

  /**
   * 错误处理
   * @param {*}} error_code 
   */
  _show_error(error_code) {
    if (!error_code) {
      error_code = 1
    }

    const tip = tips[error_code]
    wx.showToast({
      title: tip? tip : tips[1],
      icon: 'none',
      duration: 2000
    })
  }

  /**
   * 把 url 上面的 path 参数，进行转换为参数值
   * 比如：classic/:index/previous 转换后 classic/1110/previous
   * 
   *  我们约定参数名要和url 的 path 参数名称一致。
   *  比如：参数 index 对应 url 的path参数 :index
   * 
   * @param {*} url 
   * @param {*} data 
   */
  _url_params_path_conversion(url, data) {
    if (data === undefined || data === null || data === {}
      || url.indexOf(":") === -1) {
      return url
    }

    let urlArr = url.split("/")
    // 最终要返回出去的 url
    let returnUrl = ''
    urlArr.map((item) => {
      // console.log('item', item)

      if (!item.startsWith(":")) {
        returnUrl = returnUrl + item + "/"
        return
      }

      // 必须是 : 开头

      const key = item.substring(1, item.length)
        // 是否是自身的属性
        if (data.hasOwnProperty(key)) {
          returnUrl = returnUrl + data[key] + "/"
        }
      
    })
    // console.log('urlPath转换：', returnUrl.substring(0, returnUrl.length - 1))
    return returnUrl.substring(0, returnUrl.length - 1)
  }
}


export { HTTP, api }